﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Lesson18_抽象类和抽象函数
{
    #region 抽象类
    //被抽象关键字abstract修饰的类 
    //特点；1:不能被实例化的类
    //2:可以包含抽线方法
    // 3;继承抽象类必须重写抽象方法
    #endregion
    #region 抽象函数 
    //特点: 只能再抽象化类中申明
    //      没有方法体
    //       不能是私有的
    //    继承后必须实行按，用override重写

    #endregion 
    abstract class  Thing
    {
        public string name;
    }
    class Water:Thing
    {

    }

    abstract class Fruit
    {
        public abstract void Bad();  //抽象方法不能有方法体，直接以；结尾
    }
    class Apple:Fruit   //继承后必须去实现，否则会报错
    {
        public override void Bad()
        {
           
        }
    }
    //虚方法和抽象方法可以不断被子类重写
    class SuperApple : Apple
    {
        public override void Bad()
        {
            base.Bad(); 
        }

    }

    internal class Program
    {
        static void Main(string[] args)
        {
            //抽象不能被实例化，但可以遵循里氏替换原则，用父类装子类
            Thing t = new Water();


        }  
    }
}
//注意：

//如何选择普通类还是抽象类

//不希望被实例化的的对象，相对比较抽象的类就可以使用抽象类

//父类中的行为不太需要被实现的，只希望子类去定于具体规则的，可以选择抽象类，然后使用其中的抽象方法来定义
